package com.ty.springbootshiro;


import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * ShiroTester
 *
 * @aurhor Administrator  whs
 * @since 2024/10/8
 */

public class ShiroTester {

    @Test
    public void testShiro(){
        // 1.创建 Realm（安全数据源）
        IniRealm realm = new IniRealm("classpath:shiro.ini");
        // 2.配置
        DefaultSecurityManager securityManager = new DefaultSecurityManager(realm);
        // 创建注入的 Realm(安全数据源)
        securityManager.setRealm(realm);
        SecurityUtils.setSecurityManager(securityManager);
        // 3.操作 Subject , 进行认证
        Subject subject = SecurityUtils.getSubject();
        // 封装一个令牌
        UsernamePasswordToken token = new UsernamePasswordToken("admin", "123456");
        try {
            subject.login(token); // 登录，即认证
        }catch (AuthenticationException e){
            System.out.println("认证异常：");
            e.printStackTrace();
        }
        System.out.println("是否通过认证： " + subject.isAuthenticated());

        // 认证通过后 进行权限认证
        System.out.println("是否为管理员角色：" + subject.hasRole("管理员"));  // 是否为某角色
        System.out.println("是否能操作用户查看功能：" + subject.isPermitted("user:view")); // 判断是否拥有某权
        subject.checkPermission("user:view");

        System.out.println("身份信息： " + subject.getPrincipal());

        /**
         * 18:43:30.420 [main] INFO org.apache.shiro.session.mgt.AbstractValidatingSessionManager -- Enabling session validation scheduler...
         * 是否通过认证： true
         * 是否为管理员角色：true
         * 是否能操作用户查看功能：true
         * 身份信息： admin
         */
    }


    @Test
    public void testMd5Hash(){
        String password = "1234";
        String salt = "离别情诗雨";
        Md5Hash md5Hash = new Md5Hash(password,salt,520 );
        System.out.println(password);
        System.out.println(salt);
        System.out.println(md5Hash.toString());

        /**
         *  加盐1次 ： 36aa3e095a86925b7658b5d00557fa77
         *  加盐2次 ： 2f508ee63a8992010e8d02d5f2898411
         *  加盐100次 ： 3a6b1ebebb6f055382c80521c0506caa
         *  离别情诗雨 字符串盐值 加盐100次  ： bfb2d1bde8fe3b57392d4e6869b6b9a5
         *  111 数字盐值 加盐100次  ： aed251a429afcaefcbe50d376030e917
         */

    }


}
